# 装饰器本质上是一个Python函数，它可以让其他函数在不需要做任何代码变动的前提下增加额外功能，
# 装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景，比如：插入日志、性能测试、
# 事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计，有了装饰器，我们就可以
# 抽离出大量与函数功能本身无关的雷同代码并继续重用。概括的讲，装饰器的作用就是为已经存在
# 的对象添加额外的功能。


#确保用户登录后方可查看信息
from flask import session,redirect,url_for,g

#确保inner函数没有问题
from functools import wraps

import config


def login_required(func):
    # 使用wraps保留func的相关信息，使用前需要from functools import wraps导入
    @wraps(func)
    #由于定义（）中的名称需要一致，考虑到多个地方将用到这个函数，所以用*args,**kwargs
    def inner(*args,**kwargs):
        # 判断用户是否在session中
        if config.CMS_USER_ID in session:
            # 将结果返还回去
            return func(*args,**kwargs)
        else:
            # 重定向
            return redirect(url_for('cms.login'))
    #不是inner()
    return inner

# 解释说明装饰器的功能
# @login_required
# def index():
#     return "cms.index"
# index=login_required(index)=inner

def permission_required(permission):
    #outter才是正真接受函数的
    def outter(func):
        @wraps(func)
        def inner(*args,**kwargs):
            user = g.cms_user
            if user.has_permission(permission):
                return func(*args,**kwargs)
            else:
                return redirect(url_for('cms.index'))
        return inner
    return outter
